Linux 上的 NFS
Table of Contents
1. Linux NFS 服务端
1.1. 安装服务
使用 RH 系发行版:
- 安装
nfs-utils
软件包sudo dnf install nfs-utils
- 开机自动启动 nfs-server
sudo systemctl enable --now nfs-server
- 开放端口
- NFSv3
sudo firewall-cmd --add-service={rpc-bind,mountd,nfs} && sudo firewall-cmd --add-service={rpc-bind,mountd,nfs} --permanent
- NFSv4
sudo sudo firewall-cmd --add-service=nfs && sudo firewall-cmd --add-service=nfs --permanent
- NFSv3
使用 Debian 系发行版:
sudo apt install nfs-kernel-server
安装 NFS 服务端sudo systemctl enable --now nfs-server.service
启动 NFS Server 并设置开机启动
执行 sudo exportfs -ra
可以让 NFS 根据 /etc/exports 文件重新载入配置。
exportfs
常用的选项有:
-r
: 使 /var/lib/nfs/xtab 和 /etc/exports 同步。将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除-a
: 根据将其它选项传递给 exportfs 导致所有目录被导出或取消导出。如果没有指定其他选项, exportfs 会导出 /etc/exports 中指定的所有文件系统-o <file_systems>
: 指定导出没有在 /etc/exports 中列出的目录。格式必须与在 /etc/exports 中的相同。这个选项通常用来测试导出的文件系统,然后再将其永久添加到导出的文件系统列表中-i
: 忽略 /etc/exports,用命令行给出的选项定义导出的文件系统-u
: 取消导出所有共享目录exportfs -ua
命令挂起所有的 NFS 共享,同时保持所有 NFS 服务exportfs -r
可新启用 NFS 共享
-v
: 在执行 exportfs 命令时,详细显示要导出或取消导出的文件系统
1.2. exports 常用配置参数
/etc/exports 管理 NFS 的共享配置,每个条目都有以下结构:
export host(options) export host1(options1) host2(options2) host3(options3) export *(options) /mnt/mp_storage0 192.168.2.11(rw,async,root_squash,no_subtree_check) /mnt/mp_backup *(ro,async,root_squash,no_subtree_check)
配置的选项有:
ro
:read-only
远程主机无法更改文件系统中共享的数据rw
:read-write
远程主机可以更改文件系统中共享的数据sync
: 同步写入。在数据写入磁盘前,NFS 服务器不返回写入成功async
: 异步写入。在数据写入磁盘前,NFS 服务器返回写入成功wdelay
: 如果 NFS 服务器预期另外一个写入请求即将发生,则 NFS 服务器会延迟写入磁盘。它减少了必须使用独立写入命令访问磁盘的次数,从而减少写入开销。要禁用此选项,指定no_wdelay
选项,该选项仅在同时指定默认同步选项时才可用root_squash
挂载 NFS 目录的用户如果是 root 那么这个用户的权限将被压缩成为匿名用户,相应的 UID 与 GID 都会变成 nobody 系统账号的身份no_root_squash
挂载 NFS 目录的用户如果是 root 那么对于这个共享目录来说,挂载方具有 root 权限 这个功能会削弱服务器安全性,不建议用all_squash
挂载 NFS 目录的所有用户均被压缩成为匿名用户,即以nobody
用户的身份登录anonuid
和anongid
将 NFS 服务器上的匿名用户的 uid 和 gid 重定向为用户指定的 uid 和 gidexport host(anonuid=uid,anongid=gid)
secure
限制挂载方只能从小于 1024 的 tcp/ip 端口连接 NFS 服务器 (默认设置),改为insecure
允许客户端从大于 1024 的 tcp/ip 端口连接服务器subtree_check
若输出目录是一个子目录,则 NFS 服务器将检查其父目录的权限 (检查对应用户有没有x
权限)no_subtree_check
若输出目录是一个子目录,则 NFS 服务器不检查其父目录的权限
如果服务器支持 NFSv3 则客户端使用 sudo showmount --exports <server-ip>
查看有哪些共享目录。
如果服务器支持 NFSv4 则客户端可以直接挂载根目录后进行查找:
mount <my-server>:/ /mnt/ ls /mnt/
1.3. 仅开启 NFSv4
NFSv4 只需要 TCP/UDP 2049
一个端口,也不需要 portmap
这个包。
只需要把 /etc/nfs.conf 中的:
[nfsd] ... # vers3=y ...
改为:
[nfsd] ... vers3=n ...
在 NFSv4 中,rpc 相关的服务已经没有用了,但依旧会随 nfs-server.service
启动。最后需要停掉它们:
sudo systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
2. Linux NFS 客户端
使用 RH 系发行版: sudo dnf install nfs-utils
安装 nfs-utils
软件包。
使用 Debian 系发行版: sudo apt install nfs-common
安装 NFS 客户端与服务端。
注: 网上教程也有说用 sudo apt install nfs-client
只安装客户端就行。但是自从 Debian 11 开始的软件库里不再有 nfs-client
, sudo apt install nfs-client
会被自动定向到安装 nfs-common
。
sudo showmount 192.168.1.10 -e
查看服务器共享了哪些文件夹。
在客户机上用 sudo mount -t nfs -o nfsvers=4 192.168.1.10:/mnt/hgst3ta ~/NetworkStorage/hgst3ta/
挂载。
注: man nfs
可以查看所有的挂载选项。
用 sudo umount 192.168.1.10:/mnt/hgst3ta
卸载。
可以创建 ~/.config/systemd/user/mnt-r6-FreeBSDa-hgst3ta.service 在用户登入时执行挂载的 .service 文件。内容如下:
[Unit] Description=Mount r6 vm100 2nd HGST 8T disk under %h/NetworkStorage/hgst3ta/. [Service] ExecStart=sudo mount.nfs4 192.168.1.10:/mnt/hgst3ta %h/NetworkStorage/hgst3ta/ ExecStop=sudo umount 192.168.1.10:/mnt/hgst3ta RemainAfterExit=yes [Install] WantedBy=default.target
systemctl --user enable mnt-r6-FreeBSDa-hgst3ta.service
在用户登入后自动执行。